package com.grouuu.update 
{
	import com.grouuu.event.TimerEvent;
	import starling.animation.DelayedCall;
	import starling.animation.Juggler;
	import starling.core.Starling;
	import starling.events.EnterFrameEvent;
	import starling.events.Event;
	import starling.events.EventDispatcher;
	import flash.events.Event;
	
	/**
	 * ...
	 * @author Grouuu
	 */
	public class Timer
	{
		// TODO : tester les trucs ci-dessous
		// • équivalent d'invalidate() et draw que sur la cadence de tick (limite le nombre de draw et je garde la main sur le fps)
		//
		// • faire de cette classe un singleton (un vrai, avec le moins possible de static)
		// • faire que seul le delay soit passé en argument de update, et non l'event complet
		
		protected var dispatcher:EventDispatcher;
		
		public function Timer()
		{
			init();
		}
		
		protected function init():void
		{
			dispatcher = new EventDispatcher();
		}
		
		// CONTROLS ///////////////////////////////////////////////////////////////////////////////
		
		public function addListener(listener:ITimer):void
		{
			dispatcher.addEventListener(TimerEvent.ON_UPDATE, listener.update);
			dispatcher.addEventListener(TimerEvent.ON_START, listener.start);
			dispatcher.addEventListener(TimerEvent.ON_STOP, listener.stop);
		}
		
		public function removeListener(listener:ITimer):void
		{
			dispatcher.removeEventListener(TimerEvent.ON_UPDATE, listener.update);
			dispatcher.removeEventListener(TimerEvent.ON_START, listener.start);
			dispatcher.removeEventListener(TimerEvent.ON_STOP, listener.stop);
		}
		
		public function start():void
		{
			dispatcher.dispatchEvent(new starling.events.Event(TimerEvent.ON_START));
			
			//Starling.current.stage.addEventListener(EnterFrameEvent.ENTER_FRAME, onFrame);
			Starling.current.nativeOverlay.stage.addEventListener(flash.events.Event.ENTER_FRAME, onFrame);
		}
		
		public function stop():void
		{
			Starling.current.stage.removeEventListener(EnterFrameEvent.ENTER_FRAME, onFrame);
			
			dispatcher.dispatchEvent(new starling.events.Event(TimerEvent.ON_STOP));
		}
		
		// EVENTS /////////////////////////////////////////////////////////////////////////////////
		
		//protected function onFrame(event:EnterFrameEvent):void
		protected function onFrame(event:flash.events.Event):void
		{
			//dispatcher.dispatchEvent(new TimerEvent(TimerEvent.ON_UPDATE, event.passedTime));
			dispatcher.dispatchEvent(new TimerEvent(TimerEvent.ON_UPDATE));
		}
	}
}